package com.zmn.plat.services.interfaces.area;

import java.util.List;

import com.zmn.common.dto.VtDTO;
import com.zmn.plat.common.dto.KVDTO;
import com.zmn.plat.model.vo.area.AreaSimpleVO;
import org.apache.ibatis.annotations.Param;

import com.zmn.common.dictionary.DictModel;
import com.zmn.common.dictionary.KvModel;
import com.zmn.common.dto.AreaDTO;
import com.zmn.plat.common.exception.PlatException;
import com.zmn.plat.model.entity.area.AreaQuery;
import com.zmn.plat.model.entity.area.BaseArea;
import com.zmn.plat.model.entity.area.CascadeAreaVO;

/**
 * @author duanzuocai
 * @modifier tanbiao 20190909 新增状态修改和拍戏修改方法
 * @since 18/10/22 11:30
 */
public interface BaseAreaService {

    /**
     * 根据城市ID查询城市贺省份信息
     *
     * @param cityId
     *            区域ID
     * @return AreaDRO 区域DRO实体
     */
    BaseArea findCityAndProvinceByCityId(Integer cityId) throws PlatException;

    /**
     * 主键查询
     *
     * @param areaId
     * @return
     */
    BaseArea findByKey(Integer areaId);

    BaseArea findByKeyWithCache(Integer areaId);

    /**
     * 主键查询
     *
     * @param areaIds
     * @return
     */
    List<BaseArea> findByKeys(List<Integer> areaIds);

    /**
     * 描述:根据经纬度查询区域
     *
     * @param longitude
     * @param latitude
     * @return
     * @auther tanghongjun
     * @since 2019/6/28 15:42
     */
    BaseArea getAreaByLatLng(Double longitude, Double latitude);

    /**
     * 省市组合
     *
     * @return 省及下面的城市
     */
    List<KvModel<Integer, String>> listAllCityAndPro();

    /**
     * 获取级联的省、市信息
     *
     * @Param:
     * @return:
     * @Author: zhuwenbing
     * @since: 2019/7/8 20:47
     */
    List<CascadeAreaVO> getProvinceCascadeAreaVOList();

    /**
     * 分页查询
     *
     * @param query
     * @return
     */
    List<BaseArea> listPageByQuery(AreaQuery query);

    /**
     * 查询所有区域VTDTO (仅用于初始化区域首字母和简拼)
     * @return
     */
    List<VtDTO> listAllVtDto();

    /**
     * 查询区域
     *
     * @param parentId
     *            上级ID
     * @return
     */
    List<BaseArea> listByParentId(Integer parentId);

    /**
     * 搜索
     *
     * @param query
     *            条件
     * @return
     */
    List<BaseArea> listByQuery(AreaQuery query);

    /**
     * 取得指定等级及以上的区域列表
     * @param status 状态
     * @return
     */
    List<BaseArea> listAboveByLevel(Integer level, Integer status);
    /**
     * 搜索
     *
     * @param query
     *            条件
     * @return
     */
    List<BaseArea> listByQueryOfPermit(AreaQuery query, Integer staffId);

    /**
     * 查询区/县及上级ID/NAME
     *
     * @param provinceId
     *            省
     * @param cityId
     *            市
     * @param countyName
     *            区
     * @return
     */
    List<BaseArea> listCounty(Integer provinceId, Integer cityId, String countyName);

    /**
     * 查询区/县及上级ID/NAME
     *
     * @param provinceId
     *            省
     * @param cityId
     *            市
     * @param countyId
     *            区
     * @param streetName
     *            街道
     * @return
     */
    List<BaseArea> listStreet(Integer provinceId, Integer cityId, Integer countyId, @Param("name") String streetName);

    /**
     * 根据城市名称集合查询城市和省份信息
     *
     * @param areaNameList
     *            区域名称集合
     * @return BaseArea集合
     */
    List<BaseArea> listProvinceAndCityByCityNameList(List<String> areaNameList);

    /**
     * 所有城市
     *
     * @return
     */
    List<DictModel> listAllCity();

    /**
     * 查询所有区域
     *
     * @param ids
     *            ID
     * @return
     */
    List<BaseArea> listAreaByIds(Integer[] ids);

    /**
     * 查询区域
     *
     * @param ids
     *            父ID
     * @return
     */
    List<BaseArea> listByParentIds(Integer[] ids, Integer staffId);

    /**
     * 通过渠道ID获取服务区域下开通的城市
     *
     * @param channelId
     *            渠道ID
     * @return
     */
    List<AreaDTO> listByChannelId(Integer channelId);

    /**
     * 通过渠道ID查询开通的城市，以及城市对应的省名称，ID，首字母
     * @param channelId
     * @return
     */
    List<AreaSimpleVO> listAreaByChannelId(Integer channelId);

    /**
     * 查询所有城市，以及城市对应的省名称，ID，首字母
     * @return
     */
    List<AreaSimpleVO> listAllCitySimpleVo();

    /**
     * 通过渠道ID,服务分类ID获取服务区域下开通的城市
     *
     * @param channelId
     *            渠道ID
     * @param showType
     *            产品分类 1后台 2前台
     * @param servCategId
     *            服务分类ID
     * @return
     */
    List<AreaDTO> listByChannelIdAndServCategId(Integer channelId, Integer showType, Integer servCategId);

    /**
     * 描述: 查询所有省份和城市，并组合成直辖市的关系
     *
     * @param
     * @return
     * @auther tanghongjun
     * @since 2019/10/28 14:58
     */
    List<KvModel<Integer, String>> listAllBaseArea();

    /**
     * 描述：根据父节点集合查询所有子节点数据
     *
     * @param
     * @return
     * @auther liubodong
     * @since 2021/01/26 14:58
     *
     */
    List<BaseArea> listAreaByParentIdList(List<Integer> parentIdList, Integer staffId, Integer level);

    /**
     * 统计
     *
     * @param query
     *            条件
     * @return
     */
    Integer countByQuery(AreaQuery query);

    /**
     * 更新状态
     *
     * @param area
     * @return
     * @author tanbiao 20190909
     */
    Integer updateStatusByKey(BaseArea area);

    /**
     * 更新首字母
     *
     * @param areaId
     *            区域id
     * @param firstLetter
     *            首字母
     * @param staffName
     *            更新人
     * @return
     */
    Integer updateFirstLetterByKey(Integer areaId, String firstLetter, String staffName);

    /**
     * 更新区域名称简拼
     * @param areaId       区域ID
     * @param simpleSpell  简拼
     * @param staffName    更新人
     * @return
     */
    Integer updateSimpleSpellByKey(Integer areaId, String simpleSpell, String staffName);

    /**
     * 更新状态 批量
     *
     * @param ids
     * @param status
     * @param mcStaffName
     * @return
     * @author tanbiao 20190909
     */
    Integer updateStatusBatchByKey(List<Integer> ids, Integer status, String mcStaffName);

    /**
     * 批量更新区域首字母和简拼
     * @param areaList
     * @return
     */
    Integer updateFirstLetterAndSimpleSpellByKeyBatch(List<BaseArea> areaList);

    /**
     * 更新排序
     *
     * @param area
     * @return
     * @author tanbiao 20190909
     */
    Integer updateSortByKey(BaseArea area);

    /**
     * 更新排序
     *
     * @param brandId
     * @param sort
     * @param mcStaffName
     * @return
     * @author tanbiao 20190909
     */
    Integer updateSortByKey(Integer brandId, Integer sort, String mcStaffName);

    /**
     * 更新
     *
     * @param area
     *            对象
     * @return
     */
    Integer updateByKey(BaseArea area);

    /**
     * 更新GB码
     *
     * @param area
     * @return
     */
    Integer updateCodeByKey(BaseArea area);

    /**
     * 插入
     *
     * @param area
     *            对象
     * @return
     */
    Integer insert(BaseArea area);

    /**
     * 删除
     *
     * @param areaId
     *            ID
     * @return
     */
    Integer deleteByKey(Integer areaId);

}
